import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import '../../../common/routers/index.dart';
import '../../../common/services/index.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';

class SplashController extends GetxController {
  // 1. 静态常量（类级别）
  static const String tag = 'SplashController';
  static const int defaultCountdownSeconds = 1;  // 修改为1秒
  static const Duration countdownInterval = Duration(seconds: 1);
  static const int maxRetryCount = 3;
  
  // 2. 实例常量
  final String appName = '中国音乐学院在线评审';
  final String appSubtitle = '专业·权威·便捷';
  final Duration animationDuration = const Duration(milliseconds: 300);
  final Duration minimumDisplayDuration = const Duration(milliseconds: 1500);
  
  // 3. 响应式变量（Rx系列）
  // 基础类型 - 使用.obs写法（推荐95%场景使用）
  var countdown = defaultCountdownSeconds.obs;     // RxInt
  var isLoading = true.obs;                        // RxBool
  var isCountdownActive = false.obs;               // RxBool
  var logoScale = 0.8.obs;                        // RxDouble
  
  // 集合类型 - 使用.obs写法
  var initializationStatus = <String, bool>{}.obs; // RxMap<String, bool>
  
  // 可空类型 - 特殊场景使用
  var lastLaunchTime = RxnString();                // 可空字符串
  
  // 4. 普通变量（非响应式）
  bool _isInitialized = false;
  String _errorMessage = '';
  int _retryCount = 0;
  DateTime? _launchTime;
  
  // 5. 控制器和服务依赖
  Timer? _countdownTimer;
  Timer? _animationTimer;
  
  // 服务依赖 - 直接使用服务实例
  PackageInfoService get _packageInfoService => Get.find<PackageInfoService>();
  UserService get _userService => Get.find<UserService>();
  
  // 6. 构造函数
  SplashController() {
    debugPrint('$tag: Constructor');
    _launchTime = DateTime.now();
  }

  // 7. 私有初始化方法
  void _initData() {
    debugPrint('$tag: 初始化闪屏页数据');
    
    // 初始化状态追踪
    initializationStatus.assignAll({
      'app_info': false,
      'permissions': false,
      'network': false,
    });
    
    // 设置应用版本信息
    _loadAppVersion();
    
    // 开始Logo动画
    _startLogoAnimation();
    
    _isInitialized = true;
    update(["splash"]);
  }
  
  /// 加载应用版本信息
  void _loadAppVersion() async {
    try {
      debugPrint('$tag: 开始加载应用版本信息...');
      
      // 从服务中获取版本信息
      if (_packageInfoService.isInitialized) {
        // 服务已初始化，直接使用
        debugPrint('$tag: 从服务获取版本信息');
        initializationStatus['app_info'] = true;
        debugPrint('$tag: 应用版本加载完成: ${_packageInfoService.versionText}');
      } else {
        // 服务未初始化，等待初始化完成
        debugPrint('$tag: 等待包信息服务初始化...');
        
        // 监听服务初始化完成
        ever(_packageInfoService.isInitializedRx, (bool isInitialized) {
          if (isInitialized) {
            debugPrint('$tag: 包信息服务初始化完成，更新版本信息');
            initializationStatus['app_info'] = true;
            debugPrint('$tag: 应用版本加载完成: ${_packageInfoService.versionText}');
            update(["splash"]);
          }
        });
        
        // 设置超时处理
        Timer(const Duration(seconds: 2), () {
          if (!_packageInfoService.isInitialized) {
            debugPrint('$tag: 包信息服务初始化超时，使用默认版本');
            initializationStatus['app_info'] = true;
            update(["splash"]);
          }
        });
      }
      
      update(["splash"]);
      
    } catch (e) {
      debugPrint('$tag: 版本信息加载失败: $e');
      _errorMessage = '版本信息加载失败';
      
      // 设置默认状态
      initializationStatus['app_info'] = true;
      update(["splash"]);
    }
  }
  
  
  /// 开始Logo动画
  void _startLogoAnimation() {
    _animationTimer = Timer.periodic(const Duration(milliseconds: 100), (timer) {
      if (logoScale.value < 1.0) {
        logoScale.value += 0.02;
        update(["splash"]);
      } else {
        timer.cancel();
        // 动画完成后开始倒计时
        _checkInitializationAndStart();
      }
    });
  }
  
  /// 检查初始化状态并开始倒计时
  void _checkInitializationAndStart() {
    debugPrint('$tag: 检查初始化状态');
    
    // 确保最小显示时间
    final elapsed = DateTime.now().difference(_launchTime!);
    final remaining = minimumDisplayDuration - elapsed;
    
    if (remaining.inMilliseconds > 0) {
      debugPrint('$tag: 等待最小显示时间: ${remaining.inMilliseconds}ms');
      Future.delayed(remaining, () {
        _startCountdown();
      });
    } else {
      _startCountdown();
    }
  }

  // 8. 业务方法
  
  /// 开始倒计时
  void _startCountdown() {
    if (!_isInitialized) {
      debugPrint('$tag: 控制器未初始化，无法开始倒计时');
      return;
    }
    
    debugPrint('$tag: 开始倒计时 ${countdown.value}秒');
    isCountdownActive.value = true;
    isLoading.value = false;
    update(["splash"]);
    
    _countdownTimer = Timer.periodic(countdownInterval, (timer) {
      if (countdown.value > 0) {
        countdown.value--;
        debugPrint('$tag: 倒计时剩余 ${countdown.value}秒');
        update(["splash"]); // ⚠️ 关键：通知UI更新
      } else {
        timer.cancel();
        isCountdownActive.value = false;
        _navigateToNextPage();
      }
    });
  }
  
  /// 跳转到下一个页面（根据登录状态决定）
  void _navigateToNextPage() {
    debugPrint('$tag: 倒计时完成，检查登录状态');
    
    try {
      // 检查用户是否已登录
      final isLoggedIn = _userService.isLoggedIn;
      debugPrint('$tag: 用户登录状态: ${isLoggedIn ? "已登录" : "未登录"}');
      
      // 根据登录状态决定跳转目标
      final targetRoute = isLoggedIn 
          ? RouteNames.systemMain   // 已登录 → 主页面
          : RouteNames.systemLogin; // 未登录 → 登录页面
      
      debugPrint('$tag: 准备跳转到: $targetRoute');
      
      // 显示加载提示
      if (isLoggedIn) {
        EasyLoading.show(
          status: '正在进入...',
          maskType: EasyLoadingMaskType.black,
        );
      }
      
      // 清空路由栈，防止用户返回到闪屏页
      Get.offAllNamed(targetRoute);
      
      // 关闭加载提示
      if (isLoggedIn) {
        Future.delayed(const Duration(milliseconds: 500), () {
          EasyLoading.dismiss();
        });
      }
      
      debugPrint('$tag: 导航成功 -> $targetRoute');
      
    } catch (e) {
      debugPrint('$tag: 导航失败: $e');
      EasyLoading.dismiss();
      _handleNavigationError(e);
    }
  }
  
  /// 处理导航错误
  void _handleNavigationError(dynamic error) {
    _errorMessage = error.toString();
    debugPrint('$tag: 导航错误: $_errorMessage');
    
    // 重试机制
    if (_retryCount < maxRetryCount) {
      _retryCount++;
      debugPrint('$tag: 第 $_retryCount 次重试导航');
      
      Future.delayed(const Duration(seconds: 1), () {
        _navigateToNextPage();
      });
    } else {
      debugPrint('$tag: 达到最大重试次数，导航失败');
      _showNavigationError();
    }
  }
  
  /// 显示导航错误
  void _showNavigationError() {
    // 使用 EasyLoading 显示错误提示
    EasyLoading.showError(
      '页面跳转失败\n请重启应用',
      duration: const Duration(seconds: 5),
      maskType: EasyLoadingMaskType.clear,
    );
  }
  
  /// 手动跳过倒计时
  void skipCountdown() {
    debugPrint('$tag: 手动跳过倒计时');
    
    if (!_isInitialized) {
      debugPrint('$tag: 控制器未初始化，忽略跳过操作');
      return;
    }
    
    _countdownTimer?.cancel();
    _animationTimer?.cancel();
    isCountdownActive.value = false;
    _navigateToNextPage();
  }
  
  /// 重新开始倒计时
  void restartCountdown() {
    debugPrint('$tag: 重新开始倒计时');
    
    if (!_isInitialized) {
      debugPrint('$tag: 控制器未初始化，无法重启倒计时');
      return;
    }
    
    _countdownTimer?.cancel();
    countdown.value = defaultCountdownSeconds;
    _retryCount = 0;
    _errorMessage = '';
    isCountdownActive.value = false;
    isLoading.value = false;
    
    update(["splash"]); // 通知UI更新
    _startCountdown();
  }
  
  /// 处理通用点击事件
  void onTap() {
    debugPrint('$tag: 通用点击事件');
    
    if (!_isInitialized) {
      debugPrint('$tag: 控制器未初始化，忽略点击');
      return;
    }
    
    // 如果正在倒计时，点击跳过
    if (isCountdownActive.value) {
      skipCountdown();
    } else if (!isLoading.value) {
      // 如果没在加载且没在倒计时，重新开始
      restartCountdown();
    }
  }
  
  /// 获取启动时间信息
  String getStartupInfo() {
    if (_launchTime != null) {
      final elapsed = DateTime.now().difference(_launchTime!);
      return '启动用时: ${elapsed.inMilliseconds}ms';
    }
    return '启动时间未知';
  }
  
  /// 获取初始化进度
  double getInitializationProgress() {
    final completed = initializationStatus.values.where((status) => status).length;
    final total = initializationStatus.length;
    return total > 0 ? completed / total : 0.0;
  }

  // 9. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit');
    // 在这里进行基础配置初始化
    lastLaunchTime.value = DateTime.now().toString();
  }

  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady');
    // 打印应用启动时间到控制台
    debugPrint('$tag: ${getStartupInfo()}');
    // 在这里进行数据初始化和启动倒计时
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose');
    // ⚠️ 重要：清理Timer资源，避免内存泄漏
    _countdownTimer?.cancel();
    _animationTimer?.cancel();
    super.onClose();
  }
}
